package com.xinggq.pay.service.context;

/**
 * 应用ID上下文工具类
 * 使用ThreadLocal存储当前线程的应用ID
 *
 * @author system
 * @since 2025/1/10
 */
public final class AppIdContext {

    /**
     * InheritableThreadLocal存储应用ID，支持跨线程传递
     */
    private static final InheritableThreadLocal<Long> APP_ID_HOLDER = new InheritableThreadLocal<>();

    /**
     * 私有构造方法，防止实例化
     */
    private AppIdContext() {
        throw new UnsupportedOperationException("工具类不允许实例化");
    }

    /**
     * 设置当前线程的应用ID
     *
     * @param appId 应用ID
     */
    public static void setAppId(Long appId) {
        APP_ID_HOLDER.set(appId);
    }

    /**
     * 获取当前线程的应用ID
     *
     * @return 应用ID，如果未设置则返回null
     */
    public static Long getAppId() {
        return APP_ID_HOLDER.get();
    }

    /**
     * 清除当前线程的应用ID
     * 建议在请求结束时调用，避免内存泄漏
     */
    public static void clear() {
        APP_ID_HOLDER.remove();
    }

    /**
     * 检查当前线程是否设置了应用ID
     *
     * @return 如果设置了应用ID返回true，否则返回false
     */
    public static boolean hasAppId() {
        return APP_ID_HOLDER.get() != null;
    }
}